-2

我不明白为什么我在 main 中的数组初始化时出错。我清除了一个变量 t 并从键盘获取它的值。但是当我尝试初始化一个大小为 t 的数组 n[] 时,它显示一个错误。请帮助

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

4 回答 4

4

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

于 2013-04-26T11:15:03.543 回答
2

我看到几个问题:

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

int[] n=new int[t];

那里有两个问题:

  1. t仅在try块内声明。它超出了该块的范围。因此,试图t在上面的最后一行使用编译时错误。

  2. 即使您通过t在块外部声明然后在块内对其进行初始化来解决此问题,编译器也无法确定它t是否具有上述最后一行的值。相反,可能已引发异常。所以这是一个错误(编译时错误)。

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

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
    }
}
于 2013-04-26T11:15:14.903 回答
0

int[] n=new int[t];<- 这里t必须是在范围内定义的。您可以将其更改为:

        int t = 0;//or some default value
        try{
            t=Integer.parseInt(br.readLine());
        }catch(IOException e){}
        int[] n=new int[t];
于 2013-04-26T11:15:03.030 回答
0

ttry-block中定义。因此它的范围limited to try block. 您无法在尝试块之外访问它。在尝试之外定义它,以便您的数组初始化可以访问它

于 2013-04-26T11:15:17.433 回答