Java:初始化问题,无法从arrayList打印"赋值"值

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)

Mic*_*zek 7

当你尝试调用appendMe.add()a时NullPointerException,当你明确地设置它时null,执行会直接跳转到catch块,而第二个for循环甚至没有运行.但是,您会静默捕获所有异常,因此不会显示错误.你可能不应该在那里进行全局尝试/捕获; 至少,e.printStackTrace();在catch块中添加一个,这样就不会无声地忽略异常


Pas*_*ent 5

首先,您将代码包含在一个try/catch块中,但是您正在吞下异常,这是一种非常糟糕的做法.不要这样做,这实际上是你在这里没有得到任何有用信息的原因.因此要么记录异常,要么e.printStackTracecatch块中打印或只是删除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)