下面是一些函数:
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 ){
}
在上面的代码片段中,我声明了一个AudioInputStream
类型的变量newAIS
。(从开始算起的第12条语句)在下一条语句中初始化变量newAIS
。当我到达if-else
部分变量newAIS
据说是由IDE未初始化,它给出了一个错误说newAis可能没有被初始化为什么是这样?变量newAIS
具有函数作用域。
另一方面,如果我声明变量newAIS
为全局变量,IDE不会发现错误。
为什么会发生这种情况?
是的,它在作用域中,但是它可能还没有被初始化——如果发生异常,那么不是给变量赋值,而是打印出异常并继续。在这种情况下,您期望newAIS
具有什么值?
局部变量在被读取之前会被检查是否有明确的赋值,但是实例/静态变量不会。
注意,如果没有继续处理异常,而是向调用者抛出另一个异常,或者一开始就没有捕捉到异常,或者返回异常,则没有问题。不清楚你真正想要处理的异常是什么——捕获Exception
通常是一种不好的做法。
你可以直接给变量赋一个开始值:
AudioInputStream newAIS = null;
…但是如果分配失败了,你真的想继续下去吗?
还请注意,您目前使用==
比较字符串,这也是一个坏主意。:
if (outputFormat == "AIFF")
应该是:
if (outputFormat.equals("AIFF"))
将变量初始化为try块。如果初始化抛出异常,只需打印它并继续。在这种情况下,你应该抛出异常。
这是因为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
。