問題描述
某牙刷安卓程式在輸入框中輸入數字位數超過 10 位后,程式會閃退,問題是必現的,多個輸入框都有相同的問題,
由于我從來沒有寫過安卓程式,只能勉為其難的搞一下,
定位程序
從 xml 檔案找起
使用輸入框的名稱——舵機,在原始碼中搜索,搜索到的 xml 檔案中有下面這些代碼:
<TextView
android:id="@+id/textView2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="40dp"
android:layout_marginLeft="40dp"
android:layout_marginTop="57dp"
android:text="舵機1"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/start_btn"
tools:ignore="MissingConstraints" />
<androidx.constraintlayout.widget.Guideline
android:id="@+id/guideline"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="vertical"
app:layout_constraintGuide_percent="0.49878347" />
<EditText
android:id="@+id/sg_1_et"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="16dp"
android:layout_marginLeft="16dp"
android:ems="3"
android:gravity="center"
android:inputType="number"
android:lines="1"
app:layout_constraintBottom_toBottomOf="@+id/textView2"
app:layout_constraintEnd_toStartOf="@+id/guideline"
app:layout_constraintStart_toEndOf="@+id/textView2"
app:layout_constraintTop_toTopOf="@+id/textView2"
tools:ignore="MissingConstraints" />
根據我之前開發 gui 程式的經驗,這個 xml 描述了頁面的布局,其中重要的部分是每一個控制元件的 id,layout 的內容只與顯示有關,與我們這里的問題毫不相關,
可以看到對應舵機 1 的輸入框,其控制元件 id 是 “@+id/sg_1_et”,這個名稱看上去多少有點奇怪,@+id/ 應該是有特定的作用,真正的名字應該是 sg_1_et,
使用輸入框 id 搜索代碼
使用 sg_1_et 為關鍵詞,在原始碼中搜索,找到了相關檔案后閱讀原始碼,看到了如下內容:
public void afterTextChanged(Editable s) {
這個函式應該是輸入框內容改變后呼叫的事件函式,s 表示一個輸入框物件,從這個物件上能夠獲取到輸入框的內容,
決議輸入框內容的代碼如下:
orderClass.cmdvalue = getData(0,Integer.parseInt(s.toString()),10,0)+"";
getData 是本地定義的一個函式,其原型如下:
public int getData(int id, int angle, int seep, int isWait) {
可以確定 getData 不會出現例外崩潰的問題,它可能的問題是計算結果不準確,那么看來問題只能出在 Integer.parseInt 上了,
Integer.parseInt 方法存在的問題
網上搜索了下這個方法,獲取到了如下資訊:
parseInt() 方法用于將字串引數作為有符號的十進制整數進行決議
我使用如下 demo 進行測驗,此 demo 摘自 Java parseInt() 方法 這個網頁中,
public class Test{
public static void main(String args[]){
int x =Integer.parseInt("9");
double c = Double.parseDouble("5");
int b = Integer.parseInt("444",16);
System.out.println(x);
System.out.println(c);
System.out.println(b);
}
}
修改 parseInt 的引數為一個超過 10 位的字串,然后將上述代碼保存為 Test.java,執行 java Test.java 運行后,程式拋出了如下例外資訊:
Exception in thread "main" java.lang.NumberFormatException: For input string: "12345678901111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111"
at java.base/java.lang.NumberFormatException.forInputString(NumberFormatException.java:65)
at java.base/java.lang.Integer.parseInt(Integer.java:652)
at java.base/java.lang.Integer.parseInt(Integer.java:770)
at Test.main(Test.java:3)
我修改的內容是 “12345678901”,模擬了上面描述的輸入超過 10 位數字的行為,果然復現了相同的問題,看來問題就在這里了,
如何修改?
根據上面的資訊,應該是輸入的數字超過了 int 型的范圍導致的問題,繼續網上搜索,發現可以使用大數類——BigInteger 來解決這個問題,
一個具體的使用 demo 如下:
import java.math.BigInteger;
public class Test{
public static void main(String args[]){
BigInteger x = new BigInteger("123456789");
int value = x.intValue();
System.out.println(value);
}
}
這個 demo 的內容正說明了問題的解決方案,其它的細節不再描述,
總結
我從來沒有開發過安卓程式,這是一個事實,但它并不代表我不能解決這里遇到的問題,
定位這個問題的思路與定位其它完全不同型別問題的思路其實也是類似的,不同的問題在某些形式上可能有很大的差別,可是真正基礎的東西卻可能是一致的,
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/211650.html
標籤:java
