Java: ตรวจสอบว่าอาร์กิวเมนต์บรรทัดคำสั่งเป็นโมฆะหรือไม่


89

ฉันต้องการตรวจสอบข้อผิดพลาดบางอย่างเพื่อหาอาร์กิวเมนต์บรรทัดคำสั่งของฉัน

public static void main(String[] args)
{
    if(args[0] == null)
    {
        System.out.println("Proper Usage is: java program filename");
        System.exit(0);
    }
}

อย่างไรก็ตามสิ่งนี้จะส่งคืนอาร์เรย์นอกขอบเขตข้อยกเว้นซึ่งเหมาะสม ฉันแค่มองหาการใช้งานที่เหมาะสม

คำตอบ:


161

ข้อโต้แย้งไม่สามารถเป็นnullได้ พวกเขาไม่เคยมีอยู่

กล่าวอีกนัยหนึ่งสิ่งที่คุณต้องทำคือตรวจสอบความยาวของอาร์กิวเมนต์ของคุณ

public static void main(String[] args)
{
    // Check how many arguments were passed in
    if(args.length == 0)
    {
        System.out.println("Proper Usage is: java program filename");
        System.exit(0);
    }
}

18

คำตอบของ @ jjnguy ถูกต้องในสถานการณ์ส่วนใหญ่ คุณจะไม่เห็นnullสตริงในอาร์เรย์อาร์กิวเมนต์ (หรือnullอาร์เรย์) หากmainถูกเรียกโดยการเรียกใช้แอปพลิเคชันจะเรียกใช้จากบรรทัดคำสั่งตามปกติ

อย่างไรก็ตามหากส่วนอื่น ๆ ของแอปพลิเคชันเรียกใช้mainเมธอดเป็นไปได้ว่าแอปพลิเคชันอาจส่งผ่านnullอาร์กิวเมนต์หรือnullอาร์เรย์อาร์กิวเมนต์

อย่างไรก็ตาม (2) เห็นได้ชัดว่าเป็นกรณีการใช้งานที่ผิดปกติอย่างมากและเป็นการละเมิดอย่างร้ายแรงของสัญญาโดยนัยสำหรับmainวิธีการเริ่มต้น ดังนั้นฉันไม่คิดว่าคุณควรกังวลกับการตรวจสอบnullค่าอาร์กิวเมนต์ในmain. ในกรณีที่ไม่น่าเกิดขึ้นเป็นที่ยอมรับสำหรับรหัสการโทรเพื่อรับไฟล์NullPointerException. ท้ายที่สุดมันเป็นจุดบกพร่องในผู้โทรที่จะละเมิดสัญญา


11

หากต้องการขยายประเด็นนี้:

เป็นไปได้ว่าตัวแปร args เองจะเป็นโมฆะ แต่ไม่ใช่ผ่านการดำเนินการตามปกติ การดำเนินการปกติจะใช้java.exeเป็นจุดเริ่มต้นจากบรรทัดคำสั่ง อย่างไรก็ตามฉันได้เห็นบางโปรแกรมที่ใช้C++โค้ดที่คอมไพล์กับ JNI เพื่อใช้jvm.dllโดยข้าม java.exe ทั้งหมด ในกรณีนี้เป็นไปได้ที่จะส่งผ่านNULLไปยังเมธอดหลักซึ่งในกรณีนี้ args จะเป็นโมฆะ

ฉันขอแนะนำให้ตรวจสอบเสมอif ((args == null) || (args.length == 0))หรือif ((args != null) && (args.length > 0))ขึ้นอยู่กับความต้องการของคุณ


0

(args == null || args.length == 0)คุณควรตรวจสอบ แม้ว่าnullจะไม่จำเป็นต้องใช้เช็ค แต่ก็เป็นแนวทางปฏิบัติที่ดี


1
การตรวจสอบที่ไม่จำเป็นไม่ใช่แนวทางปฏิบัติที่ดี nullเช็คอินคือไม่จำเป็น แต่คุณถูกต้องว่าlengthการตรวจสอบเป็นสิ่งที่จำเป็น
สตีเฟ่น C

0

หากฉันต้องการตรวจสอบว่ามีการส่งผ่านตำแหน่ง Speicfic ของการโต้แย้งบรรทัดคำสั่งหรือไม่แล้วจะตรวจสอบได้อย่างไร เช่นในบางสถานการณ์ 2 บรรทัดคำสั่ง args จะถูกส่งผ่านและในบางสถานการณ์จะถูกส่งผ่านไปจากนั้นจะตรวจสอบว่ามีการส่งผ่านบรรทัดคอมมานด์ specfic ได้อย่างไร?

public class check {

public static void main(String[] args) {
if(args[0].length()!=0)
{
System.out.println("entered first if");
}
if(args[0].length()!=0 && args[1].length()!=0)
{
System.out.println("entered second if");
}
}
}

ดังนั้นในรหัสด้านบนหากไม่ผ่าน args [1] ฉันจะได้รับ java.lang.ArrayIndexOutOfBoundsException:

ดังนั้นฉันจะจัดการกับสิ่งนี้ได้อย่างไรโดยที่ฉันสามารถตรวจสอบได้ว่าการโต้แย้งครั้งที่สองผ่านไปหรือไม่และหากผ่านแล้วให้ป้อน ต้องการความช่วยเหลือโดยเร็ว


กรุณาตั้งคำถามนี้ เนื่องจากไม่ตอบคำถามจึงไม่ได้อยู่ที่นี่ การถามคำถามแทนคุณจะมีโอกาสได้รับคำตอบที่ดีกว่ามาก
AlexH

-10

หากคุณไม่ผ่านอาร์กิวเมนต์ใด ๆ แม้ในกรณีนั้น args จะเริ่มต้น แต่ไม่มีรายการ / องค์ประกอบใด ๆ ลองทำตามวิธีต่อไปนี้คุณจะได้รับผลเช่นเดียวกัน :

 
public static void main(String[] args) throws InterruptedException {
        String [] dummy= new String [] {};
        if(dummy[0] == null)
        {
            System.out.println("Proper Usage is: java program filename");
            System.exit(0);
        }

    }


1
สิ่งนี้ไม่ถูกต้องทั้งหมด หากเปิดแอปพลิเคชันโดยไม่มีอาร์กิวเมนต์บรรทัดคำสั่งmainเมธอดจะถูกเรียกด้วยargsอาร์เรย์ที่มีความยาวเป็นศูนย์
Stephen C

@Stephen อาร์เรย์ที่ไม่มีองค์ประกอบใด ๆ ภายในมีความยาวเป็นศูนย์ แล้วคำตอบของฉันผิดอะไร?
Puspendu Banerjee

@Puspendu - มีอะไรผิดปกติที่dummy[0]พ่นดัชนีอาร์เรย์ออกนอกขอบเขต !! หากคุณเปลี่ยนโปรแกรม (ย้อนกลับ) เป็นการทดสอบargs[0]และเรียกใช้โดยไม่มีข้อโต้แย้ง
Stephen C

1
โอเคฉันเข้าใจแล้ว. มันจะช่วยได้ถ้าคุณไม่พิมพ์ประโยคแรกผิด ตามที่เขียนไว้มันเข้าใจไม่ได้ ฉันทราบว่าคุณได้แก้ไขอย่างเงียบ ๆ ในความคิดเห็นล่าสุดของคุณ ส่อเสียด.
Stephen C

1
"ฉันไม่ได้ให้วิธีแก้ไขใด ๆ แต่ฉันพยายามอธิบายปัญหา" แล้วอย่าโพสต์คำตอบ แสดงความคิดเห็น.
ชิงทรัพย์รับบี
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.