$ 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){
}
}
}
答案 0 :(得分:7)
当你试图调用appendMe.add()
时会抛出NullPointerException
,因为你明确地将它设置为null
,所以执行是直接跳转到catch块而第二个是循环isn'甚至跑步。但是,您会静默捕获所有异常,因此不会显示错误。你可能不应该在那里进行全局尝试/捕获;至少,在catch块中添加e.printStackTrace();
,这样就不会无声地忽略异常
答案 1 :(得分:5)
首先,您将代码封装在try/catch
区块中,但您吞噬异常,这是一种非常糟糕的做法。不要这样做,这实际上是你在这里没有得到任何有用信息的原因。因此,要么记录例外情况,要么在e.printStackTrace
块中打印catch
,要么只删除try/catch
,要么没有要检查的Exception
。
其次,您应该编程接口,而不是具体的类(这样,您可以在不修改整个代码的情况下更改具体实现)。所以,而不是:
ArrayList<String> appendMe;
声明:
List<String> appendMe;
第三,你需要在某处初始化appendMe
(这实际上是导致故障的根本原因并导致NullPointerException
),例如在声明时:
List<String> appendMe = new ArrayList<String>();
最后,我建议在循环中使用括号,即使只有一行。
总结:
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);
}
}
}
答案 2 :(得分:4)
您需要初始化appendMe。
appendMe = new ArrayList<String>();
答案 3 :(得分:3)
使用空catch
块编写代码是非常糟糕的做法。不要养成这样做的习惯。虽然suihock捕获了问题的根本原因,但如果你在catch块中打印了异常:
} catch (Exception e) {
System.out.println("Got an exception: " + e.getMessage());
}
...你会立即找到问题的原因。