当声明变量具有函数作用域时,我得到类型的错误

时间:2011-09-12 09:40:50

标签: java scope global-variables

以下是一些功能:

        jTextField1.setEnabled(false);
        jTextField2.setEnabled(false);
        jTextField3.setEnabled(false);
        jComboBox1.setEnabled(false);
        jComboBox2.setEnabled(false);
        String samplingRate = jTextField1.getText();
        String sampleSize = jTextField2.getText();
        String channels = jTextField3.getText();
        String endian = (String)jComboBox1.getSelectedItem();
        String outputFormat = (String)jComboBox2.getSelectedItem();
        AudioFormat outputAudioFormat = new AudioFormat( Float.parseFloat(samplingRate) , Integer.parseInt(sampleSize) , Integer.parseInt(channels) , true , Boolean.parseBoolean(endian) );
        AudioInputStream newAIS;  // newAIS declared Here 
        try {
         newAIS = AudioSystem.getAudioInputStream(outputAudioFormat,  AudioSystem.getAudioInputStream(new File(originalFile) ) );
         // The above statement converts the data in the original file to the data filled by the user
        } catch( Exception exc ){
            System.out.println( exc );
          }
        String outLoc = null;
        JFileChooser saveLoc = new JFileChooser();
        int option = saveLoc.showSaveDialog(this);
        if( option == JFileChooser.APPROVE_OPTION ) 
            outLoc = saveLoc.getSelectedFile().getAbsolutePath();
        try {
        if( outputFormat == "AIFF" ) {
          AudioSystem.write(newAIS, AudioFileFormat.Type.AIFF, new File(outLoc) ); 
          // the above line gives an error saying that newAis might not have been intialized                  
        } else if( outputFormat == "WAVE") {
            AudioSystem.write(newAIS, AudioFileFormat.Type.WAVE, new File(outLoc) );
            // the above line gives an error saying that newAis might not have been intialized     
          } else if( outputFormat == "AU") {
              AudioSystem.write(newAIS, AudioFileFormat.Type.AU, new File(outLoc) );
              // the above line gives an error saying that newAis might not have been intialized     
            } else if( outputFormat == "SND") {
                AudioSystem.write(newAIS, AudioFileFormat.Type.SND, new File(outLoc) );
                // the above line gives an error saying that newAis might not have been intialized     
              }
        } catch( Exception exc ){
          }

在上面的代码段中,我声明了newAIS类型的变量AudioInputStream(从开始的第12个语句)在下一个语句中,变量newAIS是初始化的。当我到达if-else部分变量newAIS时,IDE被认为是未初始化的,它会出错,说明 newAis可能尚未初始化为什么会这样?变量newAIS具有函数范围。

另一方面,如果我声明变量newAIS全局,则IDE不会发现错误。

为什么会这样?

3 个答案:

答案 0 :(得分:1)

是的,它位于范围中,但它可能尚未初始化 - 如果发生异常,则代替为变量分配值,您只需打印出异常并继续。在这种情况下,您期望newAIS有什么价值?

在读取之前检查局部变量的确定赋值,但实例/静态变量不是。

请注意,如果没有继续处理异常事实,而是向调用者抛出另一个异常,或者只是在第一时间没有捕获它,或者返回,没关系。目前尚不清楚你真正想要处理的是什么例外 - 一般来说,抓住Exception是一种不好的做法。

可以只为变量赋值以开头:

AudioInputStream newAIS = null;

...但如果作业失败,真的想继续吗?

另请注意,您目前正在使用==比较字符串,这也是一个坏主意。这样:

if (outputFormat == "AIFF")

应该是:

if (outputFormat.equals("AIFF"))

答案 1 :(得分:1)

将变量初始化为try块。如果初始化抛出异常,则只需打印并继续。在这种情况下你应该抛出异常。

答案 2 :(得分:0)

这是因为newAIS = AudioSystem.getAudioInputStream(...中可能会发生异常,因此newAIS永远不会被初始化。

您应该执行以下操作:

AudioInputStream newAIS = null;  // newAIS declared Here 
try {
   newAIS = AudioSystem.getAudioInputStream(outputAudioFormat, AudioSystem.getAudioInputStream(new File(originalFile) ) );

   } catch( Exception exc ){
         // handle the exception properly not just write something out!
}

您可能希望在catch中返回,以避免NullPoiterException