代码之家  ›  专栏  ›  技术社区  ›  Siber

试图逐行将文本文件加载到数组中,但数组保持为空,我做错了什么?(Java,android工作室)

  •  3
  • Siber  · 技术社区  · 9 年前
    private String[] words;
    
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mDecorView = getWindow().getDecorView();
    
        loadWords();
    
        TextView tv = (TextView) findViewById(R.id.word);
        tv.setText(words[0]);
    }
    
     public void loadWords()
    {
    
        try {
            InputStream file = new FileInputStream("words.txt");
            InputStreamReader sr = new InputStreamReader(file);
            BufferedReader br = new BufferedReader(sr);
    
            int n = 0;
            while(br.readLine() != null)
            {
                words[n] = br.readLine();
                n++;
            }
    
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    

    好的,所以我只是试图打印出数组中的第一个元素,但应用程序在启动过程中崩溃,并给出错误“尝试从空数组读取”

    EDIT-解决方案
    -我没有初始化数组。(我知道我有100行)
    -我的输入流不正确(找不到我的文件)
    -我试图从一个单独的布局(当时未选中)更新TextView

    String[] words = new String[100];
    
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mDecorView = getWindow().getDecorView();
        loadWords();
    }
    
    public void changeView(View view) {
    
        setContentView(R.layout.game_view);
        TextView tv = (TextView) findViewById(R.id.word);
        tv.setText(words[0]);
    }
    
    public void loadWords()
    {
        try {
            BufferedReader br = new BufferedReader(new InputStreamReader(getAssets().open("words.txt")));
            for(int i = 0;i<words.length;i++)
            {
                words[i] = br.readLine();
            }
            br.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    
    2 回复  |  直到 9 年前
        1
  •  2
  •   Karthik R    9 年前

    您需要初始化阵列,但您没有这样做。数组的声明和初始化是不同的,不是吗?

    数组的初始化将按如下方式进行:

    private String[] words = new String[2000];
    

    请尝试。但是,请尝试替换为 ArrayList 而不是 array

        2
  •  1
  •   Community pid    7 年前

    很可能您从未初始化过阵列。你刚刚宣布了。

    重点是:您的代码只是说:我想使用字符串数组( String[] words ).

    但为了真正做到这一点,您必须创建一个要填充的数组对象(请参见 here 关于如何做到这一点的各种方法)

    另一方面:“只是创建一个数组”;可能很难;考虑到您可能不知道阵列中需要多少行(但在初始化阵列对象时需要知道这一点)。

    因此,我建议使用动态集合类,如 ArrayList<String> 而不是固定大小的阵列。只需在谷歌上搜索;以及你在发布这个问题之前应该做的研究…嗯,之后。