❶ java求出兩個字元串的最長的前綴節點
public static String GetMostLongPreNode(String s1, String s2)
{
char[] c1=s1.toCharArray();
char[] c2=s2.toCharArray();
int length=c1.length<c2.length?c1.length:c2.length;
for (int i = 0; i < length; i++) {
if(i==0&&c1[i]!=c2[i])return "沒有相等的前綴節點";
if(i==length-1&&c1[i]==c2[i])return ""+c1[i];
if(c1[i]!=c2[i])return ""+c1[i-1];
}
return "沒有相等的前綴節點";
}
❷ Java是什麼東西
Java 是 Sun 公司推出的一種編程語言。它是一種通過解釋方式來執行的語言,語法規則和 C++ 類似。
同時, Java 也是一種跨平台的程序設計語言。用 Java 語言編寫的程序叫做 「Applet」 (小應用程序),用編譯器將它編譯成類文件後,將它存在 WWW 頁面中,並在 HTML 檔上作好相應標記,用戶端只要裝上 Java 的客戶軟體就可以在網上直接運行 「Applet」 。 Java 非常適合於企業網路和 Internet 環境,現在已成為 Internet 中最受歡迎、最有影響的編程語言之一。 Java 有許多值得稱道的優點,如簡單、面向對象、分布式、解釋性、可靠、安全、結構中立性、可移植性、高性能、多線程、動態性等。 Java 擯棄了 C++ 中各種弊大於利的功能和許多很少用到的功能。 Java 可以運行與任何微處理器,用 Java 開發的程序可以在網路上傳輸,並運行於任何客戶機上。 JAVA的特點
Java是一種跨平台,適合於分布式計算環境的面向對象編程語言。具體來說,它具有如下特性:簡單性、面向對象、分布式、解釋型、可靠、安全、平台無關、可移植、高性能、多線程、動態性等。下面我們將重點介紹Java語言的面向對象、平台無關、分布式、多線程、可靠和安全等特性。
- 面向對象
面向對象其實是現實世界模型的自然延伸。現實世界中任何實體都可以看作是對象。對象之間通過消息相互作用。另外,現實世界中任何實體都可歸屬於某類事物,任何對象都是某一類事物的實例。如果說傳統的過程式編程語言是以過程為中心以演算法為驅動的話,面向對象的編程語言則是以對象為中心以消息為驅動。用公式表示,過程式編程語言為:程序=演算法+數據;面向對象編程語言為:程序=對象+消息。
所有面向對象編程語言都支持三個概念:封裝、多態性和繼承,Java也不例外。現實世界中的對象均有屬性和行為,映射到計算機程序上,屬性則表示對象的數據,行為表示對象的方法(其作用是處理數據或同外界交互)。所謂封裝,就是用一個自主式框架把對象的數據和方法聯在一起形成一個整體。可以說,對象是支持封裝的手段,是封裝的基本單位。Java語言的封裝性較強,因為Java無全程變數,無主函數,在Java中絕大部分成員是對象,只有簡單的數字類型、字元類型和布爾類型除外。而對於這些類型,Java也提供了相應的對象類型以便與其他對象交互操作。
多態性就是多種表現形式,具體來說,可以用"一個對外介面,多個內在實現方法"表示。舉一個例子,計算機中的堆棧可以存儲各種格式的數據,包括整型,浮點或字元。不管存儲的是何種數據,堆棧的演算法實現是一樣的。針對不同的數據類型,編程人員不必手工選擇,只需使用統一介面名,系統可自動選擇。運算符重載(operator overload)一直被認為是一種優秀的多態機制體現,但由於考慮到它會使程序變得難以理解,所以Java最後還是把它取消了。
繼承是指一個對象直接使用另一對象的屬性和方法。事實上,我們遇到的很多實體都有繼承的含義。例如,若把汽車看成一個實體,它可以分成多個子實體,如:卡車、公共汽車等。這些子實體都具有汽車的特性,因此,汽車是它們的"父親",而這些子實體則是汽車的"孩子"。Java提供給用戶一系列類(class),Java的類有層次結構,子類可以繼承父類的屬性和方法。與另外一些面向對象編程語言不同,Java只支持單一繼承。
Java是平台無關的語言是指用Java寫的應用程序不用修改就可在不同的軟硬體平台上運行。平台無關有兩種:源代碼級和目標代碼級。C和C++具有一定程度的源代碼級平台無關,表明用C或C++寫的應用程序不用修改只需重新編譯就可以在不同平台上運行。
Java主要靠Java虛擬機(JVM)在目標碼級實現平台無關性。JVM是一種抽象機器,它附著在具體操作系統之上,本身具有一套虛機器指令,並有自己的棧、寄存器組等。但JVM通常是在軟體上而不是在硬體上實現。(目前,SUN系統公司已經設計實現了Java晶元,主要使用在網路計算機NC上。另外,Java晶元的出現也會使Java更容易嵌入到家用電器中。)JVM是Java平台無關的基礎,在JVM上,有一個Java解釋器用來解釋Java編譯器編譯後的程序。Java編程人員在編寫完軟體後,通過Java編譯器將Java源程序編譯為JVM的位元組代碼。任何一台機器只要配備了Java解釋器,就可以運行這個程序,而不管這種位元組碼是在何種平台上生成的(過程如圖1所示)。另外,Java採用的是基於IEEE標準的數據類型。通過JVM保證數據類型的一致性,也確保了Java的平台無關性。
❸ 用java編寫輸入兩個字元串輸出最大相同字元串
這種東西一搜一大堆啊
publicclassLCString3{
publicstaticvoidgetLCString(char[]str1,char[]str2){
inti,j;
intlen1,len2;
len1=str1.length;
len2=str2.length;
intmaxLen=len1>len2?len1:len2;
int[]max=newint[maxLen];
int[]maxIndex=newint[maxLen];
int[]c=newint[maxLen];
for(i=0;i<len2;i++){
for(j=len1-1;j>=0;j--){
if(str2[i]==str1[j]){
if((i==0)||(j==0))
c[j]=1;
else
c[j]=c[j-1]+1;
}else{
c[j]=0;
}
if(c[j]>max[0]){//如果是大於那暫時只有一個是最長的,而且要把後面的清0;
max[0]=c[j];
maxIndex[0]=j;
for(intk=1;k<maxLen;k++){
max[k]=0;
maxIndex[k]=0;
}
}elseif(c[j]==max[0]){//有多個是相同長度的子串
for(intk=1;k<maxLen;k++){
if(max[k]==0){
max[k]=c[j];
maxIndex[k]=j;
break;//在後面加一個就要退出循環了
}
}
}
}
}
for(j=0;j<maxLen;j++){
if(max[j]>0){
System.out.println("第"+(j+1)+"個公共子串:");
for(i=maxIndex[j]-max[j]+1;i<=maxIndex[j];i++)
System.out.print(str1[i]);
System.out.println("");
}
}
}
publicstaticvoidmain(String[]args){
Stringstr1=newString("helloworld");
Stringstr2=newString("hello,world");
getLCString(str1.toCharArray(),str2.toCharArray());
}
}
❹ 應該怎樣學習JAVA順序是什麼
不知道Java 學習順序的話,我提供你一條學習線路圖!
按照視頻學習的過程中,學習方法也是很重要的!一定要記得勤記筆記,整理程思維導圖,方便後續復習方便。
第一部分:JavaSE:Java語言最基本的一套庫
學習JavaEE或JavaME之前,JavaSE是必學的。
* Java開發環境搭建
* Java基礎語法
* 面向對象
* 數組
* 異常
* 集合
* 線程
* IO流
* 反射機制
* 註解Annotation
* 網路編程
第二部分:資料庫 【MySQL + JDBC】
* 只要學習編程,資料庫是一定要學習的,是一門公共的學科。
* java、C、python、C#等程序員都需要學習資料庫。
* 資料庫產品很多: MySQL、Oracle、SqlServer、DB2......
* 我們動力節點資料庫課程包括:MySQL + Oracle
* Oracle:銀行、政府使用oracle的較多。
* MySQL:互聯網公司、一般企業使用MySQL較多。
* Oracle我們是提供視頻的。課堂上不講。
* 我們課堂上講MySQL。
* Java語言鏈接資料庫:JDBC
第三部分:WEB前端
* 系統結構:B/S【Browser/Server】 C/S【Client/Server】
* WEB是網站的意思。WEB前端是:網站當中的頁面。
* WEB前端程序是運行在瀏覽器當中的。
* HTML5 + CSS3 + JavaScript(JS)
* WEB前端也有很多框架:
- jQuery
- Bootstrap
- Vue
- NodeJS
- AugularJS
- RectJS
- LayUI
- EasyUI
.....
第四部分:JavaWEB
* Servlet
* JSP
* AJAX(是JavaScript的一部分語法,專門做頁面局部刷新)
第五部分:JavaWEB項目
* 做一個B/S結構的項目,將WEB前端和JavaWEB內容做一個整合練習。
* 其實到這里為止,所有的系統都可以做了。但是用的技術很Low。沒有用框架。
❺ 什麼是java關鍵字
Abstract抽象的一個Java語言中的關鍵字,用在類的聲明中來指明一個類是不能被實例化的,但是可以被其它類繼承。一個抽象類可以使用抽象方法,抽象方法不需要實現,但是需要在子類中被實現break一個Java的關鍵字,用來改變程序執行流程,立刻從當前語句的下一句開始執行從。如果後面跟有一個標簽,則從標簽對應的地方開始執行caseJava語言的關鍵字,用來定義一組分支選擇,如果某個值和switch中給出的值一樣,就會從該分支開始執行。catchJava的一個關鍵字,用來聲明當try語句塊中發生運行時錯誤或非運行時異常時運行的一個塊。charJava語言的一個關鍵字,用來定義一個字元類型continue一個Java的關鍵字,用來打斷當前循環過程,從當前循環的最後重新開始執行,如果後面跟有一個標簽,則從標簽對應的地方開始執行。do一個Java語言的關鍵字,用來聲明一個循環,這個循環的結束條件可以通過while關鍵字設置double一個Java語言的關鍵字,用來定義一個double類型的變數else一個Java語言的關鍵字,如果if語句的條件不滿足就會執行該語句。final一個Java語言的關鍵字。你只能定義一個實體一次,以後不能改變它或繼承它。更嚴格的講:一個final修飾的類不能被子類化,一個final修飾的方法不能被重寫,一個final修飾的變數不能改變其初始值。finally一個Java語言的關鍵字,用來執行一段代碼不管在前面定義的try語句中是否有異常或運行時錯誤發生。float一個Java語言的關鍵字,用來定義一個浮點數變數for一個Java語言的關鍵字,用來聲明一個循環。程序員可以指定要循環的語句,推出條件和初始化變數。ifJava編程語言的一個關鍵字,用來生成一個條件測試,如果條件為真,就執行if下的語句。implementsJava(TM)編程語言的一個關鍵字,在類的聲明中是可選的,用來指明當前類實現的介面。importJava(TM)編程語言的一個關鍵字,在源文件的開始部分指明後面將要引用的一個類或整個包,這樣就不必在使用的時候加上包的名字。instanceof一個二操作數的Java(TM)語言關鍵字,用來測試第一個參數的運行時類型是否和第二個參數兼容。intJava(TM)的一個關鍵字,用來定義一個整形變數Java(TM)的一個關鍵字,用來定義一系列的方法和常量。它可以被類實現,通過implements關鍵字。longJava語言的一個關鍵字,用來定義一個long類型的變數。privateJava語言的一個關鍵字,用在方法或變數的聲中。它表示這個方法或變數只能被這個類的其它元素所訪問。protectedJava語言的一個關鍵字,在方法和變數的聲明中使用,它表示這個方法或變數只能被同一個類中的,子類中的或者同一個包中的類中的元素所訪問。publicJava語言的一個關鍵字,在方法和變數的聲明中使用,它表示這個方法或變數能夠被其它類中的元素訪問。returnJava語言的一個關鍵字,用來結束一個方法的執行。它後面可以跟一個方法聲明中要求的值。shortJava語言的關鍵字,用來定義一個short類型的變數。staticJava語言的關鍵字,用來定義一個變數為類變數。類只維護一個類變數的拷貝,不管該類當前有多少個實例。"static"同樣能夠用來定義一個方法為類方法。類方法通過類名調用而不是特定的實例,並且只能操作類變數。thisJava語言的關鍵字,用來代表它出現的類的一個實例。this可以用來訪問類變數和類方法。throwJava語言的關鍵字,允許用戶拋出一個exception對象或者任何實現throwable的對象throwsJava語言的關鍵字,用在方法的聲明中來說明哪些異常這個方法是不處理的,而是提交到程序的更高一層。transientJava語言的關鍵字,用來表示一個域不是該對象串列化的一部分。當一個對象被串列化的時候,transient型變數的值不包括在串列化的表示中,然而非transient型的變數是被包括進去的。tryJava語言的關鍵字,用來定義一個可能拋出異常語句塊。如果一個異常被拋出,一個可選的catch語句塊會處理try語句塊中拋出的異常。同時,一個finally語句塊會被執行,無論一個異常是否被拋出。voidJava語言的關鍵字,用在Java語言的方法聲明中說明這個方法沒有任何返回值。"void"也可以用來表示一句沒有任何功能的語句。volatileJava語言的關鍵字,用在變數的聲明中表示這個變數是被同時運行的幾個線程非同步修改的。whileJava語言的一個關鍵字,用來定義一段反復執行的循環語句。循環的退出條件是while語句的一部分。關於break和continue。continue語句與break語句相關,但較少用到。continue語句用於使其所在的for、while或do-while語句開始下一次循環。在while與do-while語句中,continue語句的執行意味著立即執行測試部分;在for循環語句中,continue語句的執行則意味著使控制傳遞到增量部分。
❻ 比較兩個文件 java實現
diff 程序的實現涉及到字元串的最長公共子串演算法,你弄懂了這個演算法,還有文件每行的hash怎麼算,那這個問題也就不難了。JAVA我不會,只能給你個基本思路:
1 讀文件A,B
2 計算A和B的每一行的hash值,存在數組ha[ ],hb[ ]中
3 計算ha和hb的最長公共子串,分別記錄公共子串在ha和hb的位置X, Y
4 如果X[i] == Y[j] , 如果i>j,標記為刪除, 如果 i<j, 標記為增加
5 如果X[i] == Y[j] 同時 i==j, 那麼 ha[X[i]-1 ] != hb[Y[j]-1 ] ,標記為修改
有些下標i,j之類的細節沒有考慮到位,我等有時間,自己用C++寫一個就比較清楚了。
❼ 求兩個字元串的最長公共子串,要求輸入兩個字元串,輸出他們的最長公共子串,包括長度。
遍歷一下就好了,java代碼:
public class CommonSubString {
public String search(String s1,String s2)
{
String max = "";
for(int i=0; i<s1.length(); i++)
{
for(int j=i; j<s1.length(); j++)
{
String sub = s1.substring(i,j);
if((s2.indexOf(sub)!=-1)&&sub.length()>max.length())
{
max = sub;
}
}
}
return max;
}
public static void main(String[] args)
{
String s1 = "abcdefghigj";
String s2 = "xyzabcdefigj";
String output = new CommonSubString().search(s1,s2);
System.out.println(output);
}
}
❽ java求最大公共子串
二樓改的
c = b.substring(i,j-1);
之後下標越界沒了。
程序無法出結果,中間有死循環。當while語句執行完之後j是a.length();然後是執行內循環for語句for(j=b.length()-1;j>0;j--) 此時只比較J>0;。。。。好像是個死循環。最內層的循環可以在加一個int k來控制。多次運行導致cpu上升至100%的。
提供一種矩陣演算法,這是LCS的一種演算法:
public class stringCompare {
/**求最長匹配子字元串演算法
str數組記錄每行生成的最大值strmax
max數組記錄str數組最大時所處的列號nummaxj
最大子字元串為substring(nummax-strmax+1,strmax+1)
*/
public static void main(String[] args) {
String s1="asdfgxxcvasdfgc";
String s2="asdfxxcv";
int m=s1.length();
int n=s2.length();
int k=0;
int nummax=0;
int []str=new int[m];
int []max=new int[m];
int []num=new int[m];
for(int i=0;i<m;i++) //生成矩陣數組
for(int j=n-1;j>=0;j--)
{
if(s1.charAt(i)==s2.charAt(j))
if(i==0||j==0)
{
num[j]=1;
max[i]=j;
str[i]=1;
}
else
{
num[j]=num[j-1]+1;
if(max[i]<num[j])
{
max[i]=j;
str[i]=num[j];
}
}
else
num[j]=0;
}
for(k=0;k<m;k++) //求str數組的最大值
{
if(nummax<str[k])
{
nummax=str[k];
}
}
for(k=0;k<m;k++)
if(nummax==str[k])
System.out.println(s2.substring(max[k]-str[k]+1,max[k]+1));
}
}
❾ java中的空指針異常怎麼解決
原文:https://www.hu.com/question
你這個問題的解決
問題定位:
在堆棧異常信息的第一行就可以定位到是哪裡出了空指針,倘若這里不是你寫的類,可以往下翻一下,找到你寫的類,就是這里出現的空指針。
問題解決:
對一個空對象調用裡面的方法或者屬性的時候會報空指針,檢查這個對象為什麼是空即可。
Java 空指針異常的若干解決方案
Java 中任何對象都有可能為空,當我們調用空對象的方法時就會拋出 NullPointerException 空指針異常,這是一種非常常見的錯誤類型。我們可以使用若干種方法來避免產生這類異常,使得我們的代碼更為健壯。本文將列舉這些解決方案,包括傳統的空值檢測、編程規范、以及使用現代 Java 語言引入的各類工具來作為輔助。
運行時檢測
最顯而易見的方法就是使用 if (obj == null) 來對所有需要用到的對象來進行檢測,包括函數參數、返回值、以及類實例的成員變數。當你檢測到 null 值時,可以選擇拋出更具針對性的異常類型,如 IllegalArgumentException,並添加消息內容。我們可以使用一些庫函數來簡化代碼,如 Java 7 開始提供的 Objects#requireNonNull 方法:
public void testObjects(Object arg) {
Object checked = Objects.requireNonNull(arg, "arg must not be null");
checked.toString();}
Guava 的 Preconditions 類中也提供了一系列用於檢測參數合法性的工具函數,其中就包含空值檢測:
public void testGuava(Object arg) {
Object checked = Preconditions.checkNotNull(arg, "%s must not be null", "arg");
checked.toString();
}
我們還可以使用 Lombok 來生成空值檢測代碼,並拋出帶有提示信息的空指針異常:
public void testLombok(@NonNull Object arg) {
arg.toString();
生成的代碼如下:
public void testLombokGenerated(Object arg) {
if (arg == null) {
throw new NullPointerException("arg is marked @NonNull but is null");
}
arg.toString();
}
這個註解還可以用在類實例的成員變數上,所有的賦值操作會自動進行空值檢測。
編程規范
·通過遵守某些編程規范,也可以從一定程度上減少空指針異常的發生。
使用那些已經對 null 值做過判斷的方法,如 String#equals、String#valueOf、以及三方庫中用來判斷字元串和集合是否為空的函數:
if (str != null && str.equals("text")) {}
if ("text".equals(str)) {}
if (obj != null) { obj.toString(); }
String.valueOf(obj); // "null"
// from spring-core
StringUtils.isEmpty(str);
CollectionUtils.isEmpty(col);
// from guava
Strings.isNullOrEmpty(str);
// from commons-collections4
CollectionUtils.isEmpty(col);
·如果函數的某個參數可以接收 null 值,考慮改寫成兩個函數,使用不同的函數簽名,這樣就可以強制要求每個參數都不為空了:
public void methodA(Object arg1) {
methodB(arg1, new Object[0]);
}
public void methodB(Object arg1, Object[] arg2) {
for (Object obj : arg2) {} // no null check
}
·如果函數的返回值是集合類型,當結果為空時,不要返回 null 值,而是返回一個空的集合;如果返回值類型是對象,則可以選擇拋出異常。Spring JdbcTemplate 正是使用了這種處理方式:
// 當查詢結果為空時,返回 new ArrayList<>()
jdbcTemplate.queryForList("SELECT * FROM person");
// 若找不到該條記錄,則拋出
jdbcTemplate.queryForObject("SELECT age FROM person WHERE id = 1", Integer.class);
// 支持泛型集合
public <T> List<T> testReturnCollection() {
return Collections.emptyList();
}
靜態代碼分析
Java 語言有許多靜態代碼分析工具,如 Eclipse IDE、SpotBugs、Checker Framework 等,它們可以幫助程序員檢測出編譯期的錯誤。結合 @Nullable 和 @Nonnull 等註解,我們就可以在程序運行之前發現可能拋出空指針異常的代碼。
但是,空值檢測註解還沒有得到標准化。雖然 2006 年 9 月社區提出了 JSR 305 規范,但它長期處於擱置狀態。很多第三方庫提供了類似的註解,且得到了不同工具的支持,其中使用較多的有:
javax.annotation.Nonnull:由 JSR 305 提出,其參考實現為 com.google.code.findbugs.jsr305;
org.eclipse.jdt.annotation.NonNull:Eclipse IDE 原生支持的空值檢測註解;
e.umd.cs.findbugs.annotations.NonNull:SpotBugs 使用的註解,基於 findbugs.jsr305;
org.springframework.lang.NonNull:Spring Framework 5.0 開始提供;
org.checkerframework.checker.nullness.qual.NonNull:Checker Framework 使用;
android.support.annotation.NonNull:集成在安卓開發工具中;
我建議使用一種跨 IDE 的解決方案,如 SpotBugs 或 Checker Framework,它們都能和 Maven 結合得很好。
SpotBugs 與 @NonNull、@CheckForNull
SpotBugs 是 FindBugs 的後繼者。通過在方法的參數和返回值上添加 @NonNull 和 @CheckForNull 註解,SpotBugs 可以幫助我們進行編譯期的空值檢測。需要注意的是,SpotBugs 不支持 @Nullable 註解,必須用 @CheckForNull 代替。如官方文檔中所說,僅當需要覆蓋 @ParametersAreNonnullByDefault 時才會用到 @Nullable。
官方文檔 中說明了如何將 SpotBugs 應用到 Maven 和 Eclipse 中去。我們還需要將 spotbugs-annotations 加入到項目依賴中,以便使用對應的註解。
以下是對不同使用場景的說明:
對於 Eclipse 用戶,還可以使用 IDE 內置的空值檢測工具,只需將默認的註解 org.eclipse.jdt.annotation.Nullable 替換為 SpotBugs 的註解即可:
Checker Framework 與 @NonNull、@Nullable
Checker Framework 能夠作為 javac 編譯器的插件運行,對代碼中的數據類型進行檢測,預防各類問題。我們可以參照 官方文檔,將 Checker Framework 與 maven-compiler-plugin 結合,之後每次執行 mvn compile 時就會進行檢查。Checker Framework 的空值檢測程序支持幾乎所有的註解,包括 JSR 305、Eclipse、甚至 lombok.NonNull。
Checker Framework 默認會將 @NonNull 應用到所有的函數參數和返回值上,因此,即使不添加這個註解,以下程序也是無法編譯通過的:
Checker Framework 對使用 Spring Framework 5.0 以上的用戶非常有用,因為 Spring 提供了內置的空值檢測註解,且能夠被 Checker Framework 支持。一方面我們無需再引入額外的 Jar 包,更重要的是 Spring Framework 代碼本身就使用了這些註解,這樣我們在調用它的 API 時就能有效地處理空值了。舉例來說,StringUtils 類里可以傳入空值的函數、以及會返回空值的函數都添加了 @Nullable 註解,而未添加的方法則繼承了整個框架的 @NonNull 註解,因此,下列代碼中的空指針異常就可以被 Checker Framework 檢測到了:
Optional 類型
Java 8 引入了 Optional<T> 類型,我們可以用它來對函數的返回值進行包裝。這種方式的優點是可以明確定義該方法是有可能返回空值的,因此調用方必須做好相應處理,這樣也就不會引發空指針異常。但是,也不可避免地需要編寫更多代碼,而且會產生很多垃圾對象,增加 GC 的壓力,因此在使用時需要酌情考慮。
方法的鏈式調用很容易引發空指針異常,但如果返回值都用 Optional 包裝起來,就可以用 flatMap 方法來實現安全的鏈式調用了:
Java 8 Stream API 同樣使用了 Optional 作為返回類型:
此外,Java 8 還針對基礎類型提供了單獨的 Optional 類,如 OptionalInt、OptionalDouble 等,在性能要求比較高的場景下很適用。
其它 JVM 語言中的空指針異常
Scala 語言中的 Option 類可以對標 Java 8 的 Optional。它有兩個子類型,Some 表示有值,None 表示空。
除了使用 Option#isEmpty 判斷,還可以使用 Scala 的模式匹配:
Scala 的集合處理函數庫非常強大,Option 則可直接作為集合進行操作,如 filer、map、以及列表解析(for-comprehension):
Kotlin 使用了另一種方式,用戶在定義變數時就需要明確區分 可空和不可空類型。當可空類型被使用時,就必須進行空值檢測。
Kotlin 的特性之一是與 Java 的可互操作性,但 Kotlin 編譯器無法知曉 Java 類型是否為空,這就需要在 Java 代碼中使用註解了,而 Kotlin 支持的 註解 也非常廣泛。Spring Framework 5.0 起原生支持 Kotlin,其空值檢測也是通過註解進行的,使得 Kotlin 可以安全地調用 Spring Framework 的所有 API。
結論
在以上這些方案中,我比較推薦使用註解來預防空指針異常,因為這種方式十分有效,對代碼的侵入性也較小。所有的公共 API 都應該使用 @Nullable 和 @NonNull 進行註解,這樣就能強制調用方對空指針異常進行預防,讓我們的程序更為健壯。
❿ java程序:寫一個判斷一個字元串和另一個字元串相同的字元且連續的字元串的長度。
從a第0位開始,取1個字元,看其是否在b中,如果是,再取前兩個,直到不是,去掉最後一個,看其長度大於1,返回這個串和串長度;
再從a第1位開始……