วิธีย้ายจาก Java 8 ไปเป็น Java 17
ที่มา: ปานกลาง การใช้เอกสารนี้ทำให้คุณสามารถอัปเกรดจาก Java 8 เป็น Java 17 ได้อย่างง่ายดาย
อัปเดตเวอร์ชันของปลั๊กอินคอมไพเลอร์ Maven
สำหรับนักพัฒนาบางราย เวอร์ชันของปลั๊กอินคอมไพเลอร์ Maven อาจเก่าเกินไป หากคุณต้องการทำงานกับ Java 17 เวอร์ชันปลั๊กอินคอมไพเลอร์ Maven ต้องมีอย่างน้อย 3.5.4
<ปลั๊กอิน> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3.8.1</version> <การกำหนดค่า> <source>17</source> <target>17</target> </configuration> </plugin>
อัปเดตการอ้างอิง
ขั้นตอนแรกเมื่ออัพเกรดจาก Java 8 เป็น Java 17 คือการอัปเดตการพึ่งพาของคุณ เนื่องจากการอ้างอิงที่คุณใช้ในตอนแรกอาจไม่รองรับ Java 17 เลย คุณจะต้องอัปเดตหากคุณต้องการลดผลกระทบของการอัพเกรดเวอร์ชันให้เหลือน้อยที่สุด มิฉะนั้นคุณอาจประสบปัญหามากมาย 1. ตัวอย่างเช่น ลอมบอกจะทำให้เกิดข้อผิดพลาดในการคอมไพล์ ข้อมูลข้อผิดพลาดมีดังนี้:
ไม่สามารถดำเนินการเป้าหมาย org.apache.maven.plugins:maven-compiler-plugin:3.2:compile (คอมไพล์เริ่มต้น) ในโครงการ encloud-common: การคอมไพล์ข้อผิดพลาดร้ายแรง: java.lang.ExceptionInInitializerError: ไม่สามารถสร้างฟิลด์ส่วนตัว com.sun .tools.javac.processing.JavacProcessingEnvironment$DiscoveredProcessors com.sun.tools.javac.processing.JavacProcessingEnvironment.discoveredProcs เข้าถึงได้: โมดูล jdk.compiler ไม่ "เปิด com.sun.tools.javac.processing" ไปยังโมดูลที่ไม่มีชื่อ
เนื่องจากลอมบอกแทรกโค้ดที่สร้างขึ้นในเวลาคอมไพล์ และใช้คลาสจาก แพ็คเกจ com.sun.tools.javac.*คุณจึงต้องอัปเดตลอมบอกเป็นเวอร์ชันล่าสุด นี่จะช่วยแก้ปัญหาได้ 2. การเชื่อมต่อผู้ดูแลสวนสัตว์จะทำให้เกิด ข้อผิดพลาด UnresolvedAddressExceptionข้อมูลข้อผิดพลาดจะเป็นดังนี้:
org.apache.zookeeper.ClientCnxn - เซสชัน 0x0 สำหรับเซิร์ฟเวอร์ 10.0.*.*/<unresolved>:2181 ข้อผิดพลาดที่ไม่คาดคิด การปิดการเชื่อมต่อซ็อกเก็ต และพยายามเชื่อมต่อ java.nio.channels.UnresolvedAddressException: null ที่ sun.nio.ch Net .checkAddress(Net.java:149) ~[?:?] ที่ sun.nio.ch.Net.checkAddress(Net.java:157) ~[?:?] ที่ sun.nio.ch.SocketChannelImpl.checkRemote( SocketChannelImpl .java:816) ~[?:?] ที่ sun.nio.ch.SocketChannelImpl.connect (SocketChannelImpl.java:839) ~[?:?] ที่ org.apache.zookeeper.ClientCnxnSocketNIO.registerAndConnect (ClientCnxnSocketNIO.java: 277 ) ~[zookeeper-3.4.13.jar:3.4.13-2d71af4dbe22557fda74f9a9b4309b15a7487f03] ที่ org.apache.zookeeper.ClientCnxnSocketNIO.connect(ClientCnxnSocketNIO.java:287) ~[zookeeper-3.4.13 .โถ:3 .4.13-2d71af4dbe22557fda74f9a9b4309b15a7487f03 ] ที่ org.apache.zookeeper.ClientCnxn$SendThread.startConnect(ClientCnxn.java:1021) ~[zookeeper-3.4.13.jar:3.4.13-2d71af4dbe22557fda74f9a9b4309b15a7487f03] ที่ org.apache.zookeeper.ClientCnxn$ ส่ง Thread.run(ClientCnxn . java:1064) [ผู้ดูแลสวนสัตว์-3.4.13.jar:3.4.13-2d71af4dbe22557fda74f9a9b4309b15a7487f03]
สาเหตุของข้อ ผิด พลาดคือใน Java 15 วิธี การ toStringสำหรับInetSocketAddressHolder ได้รับการปรับโครงสร้างใหม่ หากคุณใช้ maven คุณสามารถใช้ คำสั่ง mvn version:display-dependency-updatesเพื่อตรวจสอบการอัปเดตการพึ่งพาได้ ผลลัพธ์จะมีลักษณะดังนี้: 
เพิ่มการพึ่งพา
หากคุณคอมไพล์ด้วย JAXB คุณจะได้รับข้อผิดพลาด นี่เป็นเพราะ JAXB ถูกลบออกจาก Java 11 ดังนั้นคุณต้องเพิ่มการอ้างอิง JAXB Maven บางส่วน
<การพึ่งพา> <groupId>javax.xml.bind</groupId> <artifactId>jaxb-api</artifactId> <version>2.3.0</version> </การพึ่งพา> <การพึ่งพา> <groupId>com.sun.xml .bind</groupId> <artifactId>jaxb-core</artifactId> <version>2.3.0</version> </dependency> <การพึ่งพา> <groupId>com.sun.xml.bind</groupId> <artifactId> jaxb-impl</artifactId> <version>2.3.0</version> </การพึ่งพา>
นอกจากนี้ Java 11 ยังลบโมดูล Java EE และ CORBA ดังนั้นคุณจะต้องเพิ่มแพ็คเกจ javax ด้วยตนเอง
<การพึ่งพา> <groupId>javax.annotation</groupId> <artifactId>javax.annotation-api</artifactId> <version>1.3.2</version> </dependency>
การจัดการ InaccessibleObjectException
หากคุณใช้การสะท้อนกลับในแอปพลิเคชันของคุณ โดยเฉพาะsetAccessible(true)คุณจะได้รับ ข้อผิดพลาด InaccessibleObjectExceptionเมื่อแอปพลิเคชันเริ่มทำงาน ข้อผิดพลาดนี้เกิดจากระบบโมดูลาร์ของแพลตฟอร์ม Java ซึ่งอนุญาตให้เข้าถึงได้ภายใต้เงื่อนไขบางประการเท่านั้น:- ชั้นเรียนจะต้องเป็นแบบสาธารณะ
- คุณต้องส่งออกแพ็คเกจของคุณเอง
# --add-opens มีไวยากรณ์ต่อไปนี้: {modules}/{package}=ALL-UNNAMED java --add-opens java.base/java.lang=ALL-UNNAMED
หรือคุณสามารถเปลี่ยนโค้ด Java ของคุณเพื่อแก้ไขปัญหานี้ได้ในที่สุด
module java.base {
exports java.lang;
}
โดยรวมแล้ว หลังจากแก้ไขปัญหาข้างต้นทั้งหมดแล้ว แอปพลิเคชันของคุณควรทำงานได้ดีบน Java 17 ฉันหวังว่าบทความนี้จะช่วยคุณในการโยกย้ายไปยัง Java 17
วิธีต่างๆ ในการวนซ้ำรายการใน Java
ที่มา: Rrtutors ในบทความนี้ เราจะเรียนรู้วิธีต่างๆ มากมายในการวนซ้ำรายการใน Java
วิธีวนซ้ำรายการใน Java
คุณสามารถใช้สามวิธีในการวนซ้ำรายการใน Java:- ใช้วิธี For Loop ขั้นสูง
- การใช้วิธีวนซ้ำ
- วนซ้ำองค์ประกอบ forEach
1. ใช้วิธี For Loop ขั้นสูง
นี่คือเวอร์ชันของ for loop พื้นฐานที่สามารถใช้เพื่อวนซ้ำรายการ นี่คือตัวอย่าง:import java.util.ArrayList;
import java.util.List;
public class Enhanced_for_loop {
public static void main(String[] args) {
List<Integer> figurez = new ArrayList<>();
figurez.add(100);
figurez.add(200);
figurez.add(300);
figurez.add(400);
for(int i: figurez) {
System.out.print(i+ " ");
}
}
}
บทสรุป:
100 200 300 400
2. การใช้วิธีวนซ้ำ
คุณยังสามารถใช้ตัววนซ้ำเพื่อวนซ้ำรายการได้ ตัววนซ้ำมีประโยชน์อย่างยิ่งเมื่อคุณต้องการแก้ไขรายการที่สามารถวนซ้ำได้ ตัวอย่าง:import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
public class Iterate_List_using_Iterators {
public static void main(String[] args) {
List<Integer> numbari = new ArrayList<>();
numbari.add(100);
numbari.add(200);
numbari.add(300);
Iterator<Integer> itr = numbari.iterator();
while(itr.hasNext()) {
int i = itr.next();
System.out.print(i+ " ");
if(i==3) {
itr.remove();
}
}
}
}
บทสรุป:
100 200 300
3. วนซ้ำองค์ประกอบสำหรับแต่ละองค์ประกอบ
หลังจากเพิ่มฟังก์ชัน lambda ลงใน Java แล้ว ไวยากรณ์ของภาษาก็แนะนำฟังก์ชัน forEach ซึ่งช่วยให้คุณสามารถวนซ้ำคอลเลกชันใดๆ ได้ ตัวอย่างโค้ดต่อไปนี้แสดงวิธีที่คุณสามารถใช้ forEach วิธีการวนซ้ำรายการ:import java.util.ArrayList;
import java.util.List;
public class Iterate_List_using_ForeEach_iterable {
public static void main(String[] args) {
List<Integer> numbari = new ArrayList<>();
numbari.add(1);
numbari.add(2);
numbari.add(3);
numbari.add(4);
numbari.forEach(System.out::println);
}
}
บทสรุป:
1 2 3 4
GO TO FULL VERSION