什么时候需要在java中初始化一个对象,什么时候不需要?

时间:2014-11-22 16:17:38

标签: java

我得到的错误是变量fin可能未在以下程序中初始化。请告诉我关于初始化的概念。 :

import java.io.*;
class ShowFile
{
    public static void main(String args[])
    throws IOException
    {
        int i;
        FileInputStream fin;
        try
        {
            fin=new FileInputStream(args[0]);
        }
        catch(FileNotFoundException e)
        {
            System.out.println("File not found");
        }
        catch(ArrayIndexOutOfBoundsException e)
        {System.out.println("Array index are out of bound");}
        do
        {
            i=fin.read();
            System.out.println((char) i);
        } while(i!=-1);
        fin.close();
    }
}

但是在下面的代码中,我没有得到这样的错误

import java.io.*; 

class ShowFile { 
  public static void main(String args[]) 
  { 
    int i; 
    FileInputStream fin; 

    // First, confirm that a file name has been specified. 
    if(args.length != 1) { 
      System.out.println("Usage: ShowFile filename"); 
      return; 
    } 

    // Attempt to open the file. 
    try { 
      fin = new FileInputStream(args[0]); 
    } catch(FileNotFoundException e) { 
      System.out.println("Cannot Open File"); 
      return; 
    } 

    // At this point, the file is open and can be read. 
    // The following reads characters until EOF is encountered. 
    try { 
      do { 
        i = fin.read(); 
        if(i != -1) System.out.print((char) i); 
      } while(i != -1); 
    } catch(IOException e) { 
      System.out.println("Error Reading File"); 
   } 

    // Close the file. 
    try { 
      fin.close(); 
    } catch(IOException e) { 
        System.out.println("Error Closing File"); 
    } 
  } 
}

为什么这样?请帮我。对于给阅读带来的不便感到抱歉。这是我的第一篇文章,所以我不确切知道如何发帖。

谢谢。

3 个答案:

答案 0 :(得分:0)

您有try-catch阻止

try {
    fin=new FileInputStream(args[0]);
} catch(...) {
 .....
}

您可以访问FileNotFoundException

的潜在客户fin然后

如果第一个区块发生异常,那么fin将被取消初始化,最终将获得NPE

将读数移到第一个区块内。

try {
    fin=new FileInputStream(args[0]);
    do {
        i=fin.read();
        System.out.println((char) i);
    } while(i!=-1);
} catch(...) {
 .....
} finally {
    if(fin != null) {
        try { fin.close(); } catch(IOException e) {}
    }
}

答案 1 :(得分:0)

变量需要在使用前初始化。 例如,在您的情况下,此行fin=new FileInputStream(args[0]);可能会抛出异常(假设文件不存在),您捕获异常,将其打印出来,然后执行此操作i=fin.read(); 此处fin可能尚未初始化。

通常,在声明它们时始终初始化所有变量是个好主意:

int i = 0;
InputStream fin = null;

下次还请发布您需要帮助的实际错误消息。它有助于不必尝试编译"你的代码在精神上猜测你在说什么。

答案 2 :(得分:0)

对于在方法中声明且未初始化的变量,从声明到变量的任何使用点都不能有任何可能的执行路径。这由编译器检查,它不会让你变得复杂。

类中的字段始终是初始化的,可能为零,因此不适用于这些字段。