我的get()
方法用紅線標記,它告訴我
此方法必須回傳 char 型別的結果
public char get() {
mutex.lock();
char c = buffer[out];
try {
while (count == 0) {
okConsume.await();
}
out = (out 1) % buffer.length;
count--;
System.out.println("Consuming " c " ...");
okConsume.signalAll();
return c;
}catch(InterruptedException ie) {
ie.printStackTrace();
}finally {
mutex.unlock();
}
}
uj5u.com熱心網友回復:
不確定“使用條件”是什么意思。但是,從您的代碼段中可以清楚地看出問題所在。
你的例外處理很爛。
沒關系。由于某些奇怪的原因,大多數示例,據我所知,每個主要的 IDE 都會把這搞砸,所以這不是你的錯。問題是,太可怕了ie.printStrackTrace()
,永遠不應該這樣寫。這不是您處理例外的方式——即使是您不想考慮的例外。
這里的具體問題是真正的意思:這個:
} catch (Something e) {
e.printStackTrace();
}
字面意思是:每當出現問題 X 時,列印關于 X 的一半資訊(特別是使用一個謊言的方法名稱 -printStackTrace
不列印堆疊跟蹤,它列印的遠不止這些。使用錯誤命名的方法是不好的形式) ,把另一半扔進垃圾箱,繼續前進。
這就是這里的問題:如果發生例外,則列印有關問題的一半資訊并繼續。繼續……什么?方法的結尾——因此,編譯器正確地抱怨:它不知道要回傳什么,而你告訴它“繼續”。
修復很簡單。選擇以下之一:
- 首選解決方案:正確處理您的例外。這并不像你想象的那么難。
- '嗯,我不想考慮它'的解決方案必須始終是:
throw new RuntimeException("uncaught", e);
而不是e.printStackTrace()
. 修復 IDE 的模板!
在這種特定情況下,“正確修復”非常容易。除非您明確撰寫一些呼叫執行緒物件方法的代碼,否則不可能發生InterruptedException 。interrupt()
你不太可能這樣做,但如果你這樣做,你有一個特定的原因。不管那可能是什么 - 編程。中斷的重點是將 await 方法中斷,以“短路它”。那你想發生什么?也許該方法通過例外退出,在這種情況下,throw new Whatever()
將完成這項作業,選擇適當的例外型別并將其記錄在您的方法中。甚至可能只是添加throws InterruptedException
到您的方法中。對于堆疊溢位問題,回答“如何在 java 中處理例外”有點寬泛,但是有很多教程。
很可能您的代碼中沒有任何.interrupt()
呼叫,在這種情況下,catch 塊是無關緊要的,它永遠不會發生。throw new RuntimeException("uncaught", e);
完全正確 - 它很簡單,它不會洗掉任何資訊,不會導致編譯器問題,例如導致您提出這個問題的問題,并且它清楚地向代碼的讀者傳達正在發生的事情(即:您不希望發生此例外,或者如果發生此例外,也不想寫任何關于它的具體內容,并且您希望消除任何呼叫者處理它的麻煩)。
uj5u.com熱心網友回復:
您的代碼應涵蓋所有可能的情況。現在不是因為如果發生例外,您不會從該方法回傳。
如果出現例外,放在里面的return
陳述句try
將無法訪問。
有關例外處理的更多資訊,我建議查看 本教程。
有兩種方法可以修復它:
- 將 return 陳述句放在
try
和catch
塊中;
public char get() {
mutex.lock();
char c = buffer[out];
try {
// some code
return c;
} catch (InterruptedException ie) {
ie.printStackTrace();
return c;
} finally {
mutex.unlock();
}
}
- 將 return 陳述句放在
finally
塊之后;
public char get() {
mutex.lock();
char c = buffer[out];
try {
// some code
} catch (InterruptedException ie) {
ie.printStackTrace();
} finally {
mutex.unlock();
}
return c;
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/478352.html