โยนข้อยกเว้นตัวชี้โมฆะ [ปิด]


14

งานของคุณคือสร้างข้อยกเว้น null-pointer นั่นคือโปรแกรมของคุณต้องยอมรับค่าที่คาดว่าจะไม่เป็นโมฆะและส่งข้อยกเว้น / ข้อผิดพลาดหรือความผิดพลาดเนื่องจากค่าเป็นโมฆะ

ยิ่งไปกว่านั้นมันไม่สามารถมองเห็นได้ชัดเจนจากการอ่านรหัสว่าค่านั้นเป็นโมฆะ เป้าหมายของคุณคือทำให้ผู้อ่านเห็นได้อย่างชัดเจนว่าค่าไม่เป็นโมฆะแม้ว่าจะเป็นจริงก็ตาม

  • แทนที่จะเป็นโมฆะคุณสามารถใช้ไม่มีไม่มีอะไรหรืออะไรก็ตามที่เทียบเท่าในภาษาของคุณ คุณยังสามารถใช้ undefined, uninitialized และอื่น ๆ
  • ปัญหาเกี่ยวกับรหัสของคุณต้องเป็นไปได้ว่าตัวแปรนั้นเป็นโมฆะ (น่าประหลาดใจ) ที่โปรแกรมคาดว่าจะมีตัวแปรที่ไม่เป็นโมฆะ
  • โปรแกรมของคุณสามารถตอบสนองต่อ null ได้โดยการโยนข้อยกเว้นการโยนข้อผิดพลาดการกระแทกหรือสิ่งใดก็ตามที่ทำได้ตามปกติเมื่อพบโมฆะที่ไม่คาดคิด

นี่คือการประกวดความนิยมดังนั้นจงฉลาด!


@Ourous คุณสามารถยกตัวอย่างเพื่อแสดงว่าคุณหมายถึงอะไร?
Ypnypn

หลังจากมองดูแล้วมันเป็นข้อผิดพลาดของการโยนมากกว่าสิ่งที่คุณกำลังมองหา
Οurous

ฉันได้รับอนุญาตให้ใช้ข้อผิดพลาดของคอมไพเลอร์หรือไม่?
Mark

1
@ Mark มันเป็นการประกวดความนิยม ให้ชุมชนตัดสินใจ ฉันจะลงคะแนนให้ข้อผิดพลาดของคอมไพเลอร์อย่างแน่นอน
11684

ฉันปิดคำถามนี้เพราะการแข่งขันมีการทุจริตปิดหัวข้อต่อฉันทามติของชุมชน
เดนนิส

คำตอบ:


33

ชวา

ลองคำนวณค่าสัมบูรณ์ของตัวเลข Java มี Math.abs เพื่อจุดประสงค์นี้อย่างไรก็ตามจำนวนที่เราใช้อาจเป็นโมฆะในบางครั้ง ดังนั้นเราต้องการวิธีการช่วยเหลือในการจัดการกับกรณีนี้:

public class NPE {
    public static Integer abs(final Integer x) {
        return x == null ? x : Math.abs(x);
    }

    public static void main(final String... args) {
        System.out.println(abs(null));
    }
}

ถ้า x เป็นโมฆะให้คืนค่าเป็นโมฆะมิฉะนั้นให้ใช้ Math.abs ()
รหัสนั้นง่ายและชัดเจนมากและควรจะทำงานได้ดีใช่มั้ย

โดยวิธีการใช้บรรทัดนี้แทน:

return x == null ? null : Math.abs(x);

ทำงานอย่างถูกต้อง ฉันคิดว่าจะทำให้มันเป็นสปอยเลอร์ แต่ .. ฉันคิดว่ามันน่างงงวย :)

ตกลงคำอธิบาย:

อันดับแรก Math.abs ไม่ใช้ Integer แต่ int (ยังมีเมธอดมากเกินไปสำหรับประเภทตัวเลขอื่น ๆ ) และส่งกลับค่า int ใน java, int เป็นชนิดดั้งเดิม (และต้องไม่เป็นโมฆะ) และจำนวนเต็มเป็นคลาสที่สอดคล้องกัน (และอาจเป็นค่าว่าง) ตั้งแต่ Java เวอร์ชัน 5 การแปลงระหว่าง int และ Integer จะดำเนินการโดยอัตโนมัติเมื่อจำเป็น ดังนั้น Math.abs สามารถรับ x, แปลงเป็น int โดยอัตโนมัติและคืนค่า int

ตอนนี้ส่วนที่แปลก: เมื่อโอเปอร์เรเตอร์ที่ประกอบไปด้วย (? :) ต้องจัดการกับ 2 นิพจน์ที่หนึ่งมีประเภทดั้งเดิมและอื่น ๆ ที่มีระดับที่สอดคล้องกัน (เช่น int และจำนวนเต็ม) หนึ่งคาดว่าจาวาจะแปลงดั้งเดิม ไปที่คลาส (aka "Boxing") โดยเฉพาะอย่างยิ่งเมื่อประเภทที่ต้องการ (ที่นี่เพื่อกลับมาจากเมธอด) คือประเภทการอ้างอิง (คลาส) และนิพจน์แรกก็เป็นประเภทอ้างอิงด้วยเช่นกัน แต่ java ทำสิ่งที่ตรงกันข้าม: แปลงชนิดการอ้างอิงเป็นชนิดดั้งเดิม (aka "unboxing") ดังนั้นในกรณีของเรามันจะพยายามแปลง x เป็น int แต่ int ไม่สามารถเป็นค่าว่างได้ดังนั้นจึงส่ง NPE

หากคุณรวบรวมรหัสนี้โดยใช้ Eclipse คุณจะได้รับคำเตือนจริง ๆ : "การเข้าถึงตัวชี้ Null: การแสดงออกของประเภท Integer นี้เป็นโมฆะ แต่ต้องยกเลิกการทำกล่องอัตโนมัติ"


/programming/7811608/java-npe-in-ternary-operator-with-autoboxing
/programming/12763983/nullpointerexception-through-auto-boxing-behavior-of-java-ternary-operator



สปอยเลอร์จะเกิดอะไรขึ้นเมื่อ x! = null (ฉันคิดออกแล้ว)
11684

@ 11684 เมื่อ x ไม่เป็นโมฆะมันทำงานได้ดี
aditsu ออกเพราะ SE นั้นชั่วร้าย

ถ้าอย่างนั้นฉันคิดว่าฉันไม่ทราบวิธีการทำงาน ถ้ามันทำงานเมื่อ x ไม่เป็นโมฆะและฉันพูดถูกว่าทำไมเรื่องนี้ถึงต้องโยนลำไส้ใหญ่จะต้องมีการแยกวิเคราะห์ในสองความรู้สึก (ซึ่งฉันจะไม่ใส่ในข้อกำหนดภาษา)
11684

@ 11684 ไม่แน่ใจว่าคุณหมายถึงอะไรเกี่ยวกับ "ประสาทสัมผัสทั้งสอง" แต่ต่อไปฉันได้เพิ่มคำอธิบายตอนนี้
aditsu ออกเพราะ SE เป็นความชั่วร้าย

23

โปรแกรมเมอร์ C ทุกคนทำข้อผิดพลาดนี้อย่างน้อยหนึ่งครั้ง

#include <stdio.h>

int main(void) {
    int n=0;
    printf("Type a number : ");
    scanf("%d",n);
    printf("Next number is : %d",n+1);
    return 0;
}

เหตุผล :

scanfใช้ตัวชี้ ( int *) ในการโต้แย้งที่นี่0ผ่าน (NULL-pointer)

การแก้ไข:

scanf("%d",&n);

http://ideone.com/MbQhMM


1
มันไม่ได้เป็นอย่างนั้น scanfเป็นฟังก์ชัน variadic และอาร์กิวเมนต์ชนิดที่ไม่ถูกต้อง ( int) int *ได้รับเมื่อมันคาดว่า เนื่องจาก C (ฉันรู้ว่าคอมไพเลอร์สามารถตรวจจับสิ่งนี้ได้ในกรณีที่scanf) ไม่สามารถตรวจสอบประเภทในฟังก์ชัน Variadic ได้ดังนั้นจึงรวบรวมอย่างมีความสุข 0เป็นตัวชี้โมฆะตามตัวอักษร แต่นี่ใช้ได้เฉพาะกับตัวอักษรที่ใช้โดยตรงเท่านั้นโดยไม่เก็บไว้ในตัวแปร nไม่เคยมีตัวชี้โมฆะ
Konrad Borowski

คุณต้องตรวจสอบค่าส่งคืนของ scanf เพื่อแก้ไขฟังก์ชันนี้
David Grayson

1
@ David มันไม่ถูกต้องโดยไม่ตรวจสอบค่าตอบแทน แต่มันจะไม่ผิดพลาดหรือวิงวอน UB - (. ในการดูเรื่องนี้เกิดขึ้นลองเปลี่ยนเส้นทางไฟล์ที่ว่างเปล่าเป็น stdin n) จะยังคงอยู่ที่ 0
Riking

14

PHP

อันนี้กัดฉันไม่กี่ครั้ง

<?php

class Foo {
  private $bar;

  function init() {
    $this->bar = new Bar();
  }

  function foo() {
    $this->bar->display_greeting(); // Line 11
  }
}

class Bar {
  function display_greeting() {
    echo "Hello, World!";
  }
}

$foo_instance = new Foo();
$foo_instance->init();
$foo_instance->foo();

ผลลัพธ์ที่คาดหวัง:

Hello, World!

ผลลัพธ์ที่แท้จริง:

Fatal error: Call to a member function display_greeting() on a non-object on line 11

aka NullPointerException

เหตุผล:

โดยค่าเริ่มต้นไวยากรณ์ตัวสร้างเข้ากันได้กับ PHP 4.x และดังนั้นฟังก์ชั่นfooเป็นตัวสร้างที่ถูกต้องสำหรับชั้นเรียนFooและทำให้แทนที่ตัวสร้างที่ว่างเปล่าเริ่มต้น ข้อผิดพลาดประเภทนี้สามารถหลีกเลี่ยงได้โดยการเพิ่มเนมสเปซให้กับโครงการของคุณ


9

CoffeeScript (บน Node.js)

ใน CoffeeScript ?เป็นโอเปอเรเตอร์ที่มีอยู่จริง หากมีตัวแปรอยู่มันจะถูกใช้มิฉะนั้นจะใช้ทางด้านขวา เราทุกคนรู้ว่ามันยากที่จะเขียนโปรแกรมพกพา กรณีตรงจุดพิมพ์ใน JavaScript อยู่ภายใต้ที่ระบุไว้ เบราว์เซอร์ใช้alert(หรือdocument.write) ใช้แมงมุมเปลือกและการใช้print Node.js console.logนี่มันบ้าไปแล้ว แต่ CoffeeScript ช่วยด้วยปัญหานี้

# Portable printer of "Hello, world!" for CoffeeScript

printingFunction = alert ? print ? console.log
printingFunction "Hello, world!"

เรียกใช้สิ่งนี้ภายใต้ Node.js ท้ายที่สุดเราต้องการให้แน่ใจว่าสคริปต์ของเราทำงานได้ดี

ReferenceError: print is not defined
  at Object.<anonymous> (printer.coffee:3:1)
  at Object.<anonymous> (printer.coffee:3:1)
  at Module._compile (module.js:456:26)

อืมทำไมคุณถึงบ่นเกี่ยวกับเรื่องนั้นเมื่อalertไม่ได้กำหนดไว้เช่นกัน?

ด้วยเหตุผลบางอย่างใน CoffeeScript ?มีการเชื่อมโยงที่เหลือซึ่งหมายความว่าจะไม่สนใจตัวแปรที่ไม่ได้กำหนดสำหรับด้านซ้ายเท่านั้น มันไม่เจาะจงเพราะเห็นได้ชัดว่านักพัฒนาบางคนอาจขึ้นอยู่กับ? ถูกทิ้งไว้เชื่อมโยง


8

ทับทิม

ค้นหา awk ใน PATH of a Unix clone

p = ENV['PATH'].split ':'

# Find an executable in PATH.
def find_exec(name)
  p.find {|d| File.executable? File.join(d, name)}
end

printf "%s is %s\n", 'awk', find_exec('awk')

อ๊ะ!

$ ruby21 find-awk.rb
find-awk.rb:5:in `find_exec': undefined method `find' for nil:NilClass (NoMethodError)
        from find-awk.rb:8:in `<main>'

จากความผิดพลาดที่เรารู้ว่าp.findเรียกว่าnil.findดังนั้นต้องp nilมันเกิดขึ้นได้อย่างไร?

ใน Ruby defมีขอบเขตของตัวเองสำหรับตัวแปรโลคอลและไม่เคยรับตัวแปรโลคอลจากขอบเขตด้านนอก ดังนั้นการมอบหมายp = ENV['PATH'].split ':'ไม่อยู่ในขอบเขต

ตัวแปรที่ไม่ได้กำหนดมักจะทำให้เกิดNameErrorแต่pเป็นกรณีพิเศษ pทับทิมมีวิธีการตั้งชื่อระดับโลก ดังนั้นจะกลายเป็นวิธีการเรียกเช่นp.find { ... } p().find { ... }เมื่อpไม่มีข้อโต้แย้งมันจะกลับnilมา (นักกอล์ฟรหัสใช้pเป็นทางลัดสำหรับnil .) แล้วnil.find { ... }เพิ่มNoMethodErrorยก

ฉันแก้ไขได้โดยเขียนโปรแกรมใหม่ใน Python

import os
import os.path

p = os.environ['PATH'].split(':')

def find_exec(name):
    """Find an executable in PATH."""
    for d in p:
        if os.access(os.path.join(d, name), os.X_OK,
                     effective_ids=True):
            return d
    return None

print("%s is %s" % ('awk', find_exec('awk')))

มันได้ผล!

$ python3.3 find-awk.py 
awk is /usr/bin

ฉันอาจต้องการให้พิมพ์awk is /usr/bin/awkแต่นั่นเป็นข้อผิดพลาดที่แตกต่างกัน


7

ค#

With()เป็นวิธีการขยายไปยังวัตถุซึ่งเป็นหลักเพียงนามแฝงสำหรับstringstring.Format()

using System;

namespace CodeGolf
{
    internal static class Program
    {
        private static void Main()
        {
            Console.WriteLine( "Hello, {0}!".With( "World" ) );
        }

        private static string With( this string format, params object[] args )
        {
            Type str = Type.GetType( "System.string" );
            MethodInfo fmt = str.GetMethod( "Format", new[] { typeof( string ), typeof( object[] ) } );

            return fmt.Invoke( null, new object[] { format, args } ) as string;
        }
    }
}

ดูดีใช่มั้ย ไม่ถูกต้อง.

Type.GetType()ต้องใช้ชื่อประเภทที่มีคุณสมบัติตรงตามตัวพิมพ์ใหญ่ - เล็ก ปัญหาคือSystem.stringไม่มีอยู่ stringเป็นเพียงนามแฝงสำหรับจริงSystem.Stringประเภทนี้: ดูเหมือนว่ามันควรจะทำงาน แต่จะโยนข้อยกเว้นเพราะstr.GetMethod()str == null

คนส่วนใหญ่ที่รู้เพียงเล็กน้อยเกี่ยวกับลักษณะเฉพาะของภาษาอาจจะสามารถมองเห็นปัญหาได้อย่างรวดเร็ว แต่ก็ยังเป็นสิ่งที่พลาดได้ง่าย


นั่นคืออันยิ่งใหญ่: D
Knerd

นี่เป็นสิ่งที่ชัดเจนเกินไป ผู้อ่านจะได้รับเบาะแสทันทีเพราะมีสองวิธีที่จะทำในสิ่งเดียวกัน.GetType()และtypeof()และจึงนำไปสู่ความผิดพลาดเมื่อผลที่ได้คือไม่เหมือนกัน ฉันคิดว่าผู้ลงประกาศต้องการใช้รหัสตรวจสอบกระสุนซึ่งไม่ใช่
ja72

เหตุใดจึงต้องใช้การสะท้อนในวิธีส่วนขยายนี้ return string.Format(format, args);รหัสที่เห็นได้ชัดคือ หากต้องการการสะท้อนกลับ (ในกรณีการใช้งานอื่น) เราจะใช้typeof(string)(จับข้อผิดพลาดในการรวบรวมเวลาไม่มีสายเวทย์) ไม่ใช่GetTypeวิธีการคงที่ ตัวอย่างจึงดูเหมือนว่า "ไม่สมจริง"
Jeppe Stig Nielsen

4

Unity3D

public GameObject asset;

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


3
รอการพัฒนาใน unity3d ต้องใช้เมาส์เหรอ?
Einacio

1
@Einacio ถ้าคุณต้องการสิ่งต่าง ๆ ที่ง่ายขึ้นคุณก็สามารถลากสินทรัพย์ลงในตัวแปรได้ มีประโยชน์มาก แต่คุณสามารถเขียนโค้ดได้โดยไม่ต้องใช้ถ้าคุณต้องการ
Fabricio

4

ทับทิม

เพียงแค่รหัสง่ายๆที่จะนำผลิตภัณฑ์ของอาร์เรย์

number_array = [2,3,9,17,8,11,14]
product = 1
for i in 0..number_array.length do
  product *= number_array[i]
end
puts product

สองสิ่งที่นี่ หนึ่งคือการที่..ผู้ประกอบการช่วงรวม ดังนั้นจึง0..xมีองค์ประกอบx + 1และรวมถึง x ซึ่งหมายความว่าเราเกินขอบเขตของอาร์เรย์ สิ่งอื่น ๆ ก็คือเมื่อคุณทำเช่นนี้ในทับทิมมันก็จะช่วยให้คุณnilกลับมา นี่เป็นเรื่องสนุกเมื่อโปรแกรมของคุณขว้างexceptสิบบรรทัดหลังจากที่เกิดข้อผิดพลาด


นี่มันชัดเจนเกินไป มันเหมือนกับการทำfor (int i = 0; i <= arr.length; i++)ใน Java
โคลจอห์นสัน

3

Android

ฉันเห็นสิ่งนี้เกิดขึ้นบ่อยเกินไป บุคคลที่ส่งข้อความไปยังกิจกรรมถัดไป (อาจเป็นรหัสสถานะข้อมูลแผนที่หรืออะไรก็ตาม) และจบลงด้วยการดึงค่า null จากIntentจาก

ได้อย่างรวดเร็วก่อนดูเหมือนว่าค่อนข้างเหมาะสม แค่:

  • ตรวจสอบว่าข้อความไม่เป็นโมฆะ
  • บรรจุลงในเจตนา
  • เริ่มกิจกรรมใหม่
  • รับความตั้งใจในกิจกรรมใหม่
  • แยกข้อความด้วยแท็ก

ในMenuActivity.java:

private void startNextActivity(String message){
    // don't pass a null!
    if(message == null)                        
        message = "not null";        

    // put message in bundle with tag "message"
    Bundle msgBundle = new Bundle();
    msgBundle.putString("message", message);   

    // pack it into a new intent
    Intent intent = new Intent(this, NextActivity.class);
    intent.putExtras(msgBundle);               
    startActivity(intent);
}

ในNextActivity.java:

private void handleMessage(){
    // get Intent
    Intent received = getIntent();
    if(received == null){
        Log.d("myAppTag","no intent? how does this even happen?");
        finish();
    }
    // get String with tag "message" we added in other activity
    String message = received.getStringExtra("message");
    if(message.length() > 10){
        Log.d("myAppTag", "my message is too long! abort!");
        finish();
    }
    // handle message here, etc
    // ...
    // too bad we never GET here!
}

FWIW, JavaDoc ไม่บอกว่าIntent.getStringExtra(String)อาจจะกลับมาnullแต่ถ้าแท็กไม่พบ เห็นได้ชัดว่าฉันใช้แท็กเดียวกันดังนั้นมันต้องเป็นอย่างอื่น ...


2
ปัญหาของคำตอบนี้คือคนที่ไม่คุ้นเคยกับการพัฒนา Android (เช่นฉัน) จะไม่สามารถชื่นชมมันได้
John Dvorak

@JanDvorak ตกลง แต่ไม่มีเรื่องใหญ่ มีคำตอบอื่น ๆ ในเว็บไซต์ที่ฉันไม่ได้ชื่นชมอย่างเต็มที่เช่นกัน :)
Geobits

3

เพียงแค่อ่านจากบัฟเฟอร์อย่างรวดเร็วซึ่งโปรแกรมเมอร์ก็ใจดีพอที่จะบันทึกอันตรายที่อาจเกิดขึ้น!

char* buffer;
int main( void )
{
    ///!!WARNING: User name MUST NOT exceed 1024 characters!!\\\
    buffer = (char*) malloc( 1024 );
    printf("Please Input Your Name:");
    scanf("%s", buffer);
}

เคล็ดลับที่ง่ายและชัดเจนมากหากคุณคาดหวังว่าโค้ดอันตราย ความคิดเห็นที่ลงท้ายด้วย '\' จะขึ้นบรรทัดใหม่ดังนั้นบัฟเฟอร์จะไม่ถูกจัดสรรหน่วยความจำ จากนั้นจะล้มเหลวในการ scanf เนื่องจากบัฟเฟอร์จะเป็น NULL (เนื่องจากตัวแปรขอบเขตไฟล์มีค่าเริ่มต้นเป็นศูนย์ใน C)


0

นิม

type TProc = proc (a, b: int): int

proc func1(a, b: int): int=a+b
proc func2(a, b: int): int=a-b

proc make_func(arg: int, target: var TProc)=
  if arg == 1:
    target = func1
  elif arg == 2:
    target = func2
  else:
    raise newException(EIO, "abc")

var f, f2: TProc

try:
  make_func(2, f)
  make_func(3, f2)
except EIO:
  discard

echo f(1, 2)
echo f2(3, 4)

สิ่งที่เกิดขึ้นที่นี่มีความซับซ้อนเล็กน้อย ใน Nimrod ขั้นตอนจะเริ่มต้นnilได้ที่ ในการmake_funcโทรครั้งแรกมันสำเร็จ อย่างไรก็ตามประการที่สองโยนข้อยกเว้นและf2ไม่กำหนดค่าเริ่มต้น มันถูกเรียกแล้วทำให้เกิดข้อผิดพลาด


0

ค#

นี่คือคลาสสิก มากวิธีที่มีประโยชน์FindStringRepresentationOfจะสร้างตัวอย่างใหม่ของพารามิเตอร์ชนิดที่กำหนดให้แล้วหาตัวแทนสตริงของอินสแตนซ์ที่

แน่นอนว่ามันจะเป็นการสิ้นเปลืองในการตรวจสอบnullทันทีหลังจากที่สร้างอินสแตนซ์ใหม่ดังนั้นฉันจึงไม่ได้ทำเช่นนั้น ...

static void Main()
{
  FindStringRepresentationOf<DateTime>();  // OK, "01/01/0001 00:00:00" or similar
  FindStringRepresentationOf<DateTime?>(); // Bang!
}

static string FindStringRepresentationOf<TNewable>() where TNewable : new()
{
  object goodInstance = new TNewable();
  return goodInstance.ToString();
}

การเปลี่ยนแปลงobjectในการประกาศตัวแปรท้องถิ่นเป็นTNewable หรือเข้าvar(C # 3 และใหม่กว่า) ทำให้ปัญหาหายไป คำแนะนำ: มวยของNullable<T> (aka T?) ผิดปกติใน. NET Framework

หลังจากแก้ไขปัญหาตามที่อธิบายไว้ในข้อความที่มองไม่เห็นข้างต้นแล้วให้ลองgoodInstance.GetType()(ข้อแตกต่างที่GetType()ไม่เหมือนToString()กันคือไม่ใช่เสมือนจริงดังนั้นจึงไม่สามารถoverrideใช้เป็นประเภทได้Nullable<>)


0

C ++:

#include <iostream>
#include <cstring>
#include <vector>
#include <conio.h>
#include <string>

using namespace std;

class A
{
public:
    string string1;
    A()
    {
        string1 = "Hello World!";
    }
};
A *a_ptr;

void init()
{
    A a1;
    a_ptr = &a1;
}

int main()
{
    init();
    cout<<a_ptr->string1;
    _getch();
    return 0;
}

สิ่งที่คุณคาดหวังคือ "Hello World!" ที่จะพิมพ์ แต่คุณจะเห็นเพียงขยะบนหน้าจอ

a1 จะถูกทำลายเมื่อขอบเขต init () เสร็จสิ้น ดังนั้น a_ptr ซึ่งชี้ไปที่ a1 จะสร้างขยะ


0

#define ONE 0 + 1

int main(void) {
    printf("1 / 1 = %d\n", 1 / ONE);
    return 0;
}

คำอธิบาย

ตัวประมวลผลล่วงหน้าไม่ได้คำนวณจริง ๆ0 + 1ดังนั้นจึงONEถูกกำหนดอย่างแท้จริงว่าเป็น0 + 1ผลลัพธ์1 / 0 + 1ซึ่งหารด้วยศูนย์และส่งผลให้เกิดข้อยกเว้นจุดลอยตัว

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