在java中运行时初始化数组

时间:2013-04-26 11:12:13

标签: java arrays

我无法理解为什么我在main中的数组初始化中遇到错误。我删除了一个变量t并从键盘中取出了它的值。但是当我尝试初始化一个大小为t的数组n []时,它会显示一个error.plz help

import java.io.*;
import java.math.BigInteger;

class smallfac
{
    static BigInteger fac(BigInteger x)
    {
        BigInteger z;
        if(x.equals(new BigInteger("1")))
            return x;
        else
        {
            z=x.multiply(fac(x.subtract(new BigInteger("1"))));
            return(z);
        }
    }

    public static void main(String args[])
    {
        InputStreamReader in=new InputStreamReader(System.in);
        BufferedReader br=new BufferedReader(in);
        try{
            int t=Integer.parseInt(br.readLine());
        }catch(IOException e){}
        int[] n=new int[t];
        for(int i=0;i<n.length;i++)
        {
            try
            {
                n[i]=Integer.parseInt(br.readLine());
            }catch(IOException e){}
        }
        for(int i=0;i<n.length;i++)
        {
            int x=n[i];
            BigInteger p = new BigInteger(Integer.toString(x));
            p=smallfac.fac(p);
            System.out.println(p);
        }
    }
}

4 个答案:

答案 0 :(得分:4)

这是一个范围问题。您在int t块内声明try,但之后尝试使用t之后的值,这是不可能的; t仅在try内可见。

答案 1 :(得分:2)

我看到一些问题:

try{
    int t=Integer.parseInt(br.readLine());
}catch(IOException e){}

int[] n=new int[t];

那里有两个问题:

  1. t仅在try块中声明。它超出了该区域之外的范围。因此,尝试在上面的最后一行使用t时出现编译时错误。

  2. 即使您通过在块外声明t然后在块内初始化它来修复它,编译器也无法确定t是否具有从最后一行开始的值以上。可能会抛出异常。所以这是一个错误(编译时错误)。

  3. 后者,第三个问题(至少):

    for(int i=0;i<n.length;i++)
    {
        try
        {
            n[i]=Integer.parseInt(br.readLine());
        }catch(IOException e){}
    }
    

    这是一个逻辑错误。如果您尝试在后续循环中使用n[i],则不知道n[i]是否已实际初始化,因为您已隐藏了异常。尽管如此,有一个I / O异常初始化n[2],因此n[2]保留默认的null值。如果您稍后尝试使用它而不检查,则会获得NullPointerException

    捕获和忽略异常是一个非常糟糕的主意,特别是针对特定代码行重复执行此操作。

    以下是main的最小修改:

    public static void main(String args[])
    {
        // Put all the code in one try block
        try {
            InputStreamReader in=new InputStreamReader(System.in);
            BufferedReader br=new BufferedReader(in);
            int t=Integer.parseInt(br.readLine());
            int[] n=new int[t];
            for(int i=0;i<n.length;i++)
            {
                n[i]=Integer.parseInt(br.readLine());
            }
            for(int i=0;i<n.length;i++)
            {
                int x=n[i];
                BigInteger p = new BigInteger(Integer.toString(x));
                p=smallfac.fac(p);
                System.out.println(p);
            }
        }catch(IOException e){
            // Report the error here
        }
    }
    

答案 2 :(得分:0)

int[] n=new int[t];&lt; - 此处t必须在范围内定义。你可以把它改成:

        int t = 0;//or some default value
        try{
            t=Integer.parseInt(br.readLine());
        }catch(IOException e){}
        int[] n=new int[t];

答案 3 :(得分:0)

t try-block 中定义。因此范围limited to try block。你不能在try block之外访问它。在try之外定义它,这样你的数组初始化就可以访问它了