hhh*_*hhh 0 java initialization arraylist
$ javac ArrayListTest.java
$ java ArrayListTest
$ cat ArrayListTest.java
import java.io.*;
import java.util.*;
public class ArrayListTest{
public static void main(String[] args) {
try {
String hello ="oeoaseu oeu hsoae sthoaust hoaeut hoasntu";
ArrayList<String> appendMe = null;
for(String s : hello.split(" "))
appendMe.add(s+" ");
for(String s : appendMe)
System.out.println(s);
//WHY DOES IT NOT PRINT?
}catch(Exception e){
}
}
}
Run Code Online (Sandbox Code Playgroud)
当你尝试调用appendMe.add()a时NullPointerException,当你明确地设置它时null,执行会直接跳转到catch块,而第二个for循环甚至没有运行.但是,您会静默捕获所有异常,因此不会显示错误.你可能不应该在那里进行全局尝试/捕获; 至少,e.printStackTrace();在catch块中添加一个,这样就不会无声地忽略异常
首先,您将代码包含在一个try/catch块中,但是您正在吞下异常,这是一种非常糟糕的做法.不要这样做,这实际上是你在这里没有得到任何有用信息的原因.因此要么记录异常,要么e.printStackTrace在catch块中打印或只是删除try/catch,没有任何检查Exception捕获.
其次,您应该编程接口,而不是具体的类(这样,您可以在不修改整个代码的情况下更改具体实现).所以,而不是:
ArrayList<String> appendMe;
Run Code Online (Sandbox Code Playgroud)
宣布:
List<String> appendMe;
Run Code Online (Sandbox Code Playgroud)
第三,你需要在appendMe某个地方进行初始化(这实际上是故障的根本原因并导致后来的原因NullPointerException),例如在声明时:
List<String> appendMe = new ArrayList<String>();
Run Code Online (Sandbox Code Playgroud)
最后,我建议在循环中使用括号,即使只有一行.
总结一下:
import java.io.*;
import java.util.*;
public class ArrayListTest{
public static void main(String[] args) {
String hello ="oeoaseu oeu hsoae sthoaust hoaeut hoasntu";
List<String> appendMe = new ArrayList<String>();
for(String s : hello.split(" ")) {
appendMe.add(s+" ");
}
for(String s : appendMe) {
System.out.println(s);
}
}
}
Run Code Online (Sandbox Code Playgroud)